package timesheets;

import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;

public class Timesheets {

	Zadanko ostatnieZadanko = null;

	public static void main(String[] args) {

		wyswietlKomunikat("Witam! Pomogę Ci wypełnić Redmine za dziś");
		ustalCzasRozpoczecia();
		ustalCzasZakonczenia();
		DayWork.czasOdDo = wyliczCzasOdDo(DayWork.czasRozpoczeciaS, DayWork.czasZakonczeniaS);
		ustalWystepowaniePrzerw();

		ustalWykonywaneZadania();
		ustalCzasDlaPoszczegolnychZadan();
		wyswietlWstepnaRozpiske();
	}

	
	/*GUI methods*/
	
	private static void wyswietlKomunikat(String txt) {
		System.out.println(txt);
	}

	private static void ustalCzasRozpoczecia() {
		Scanner scan = new Scanner(System.in);
		wyswietlKomunikat("Podaj czas rozpoczęcia (jeśli to pominiesz, przyjmuję Twój default, czyli 09:30:00)");
		DayWork.czasRozpoczeciaS = scan.nextLine();
		if (DayWork.czasRozpoczeciaS.equalsIgnoreCase("")) {
			DayWork.czasRozpoczeciaS = "09:30:00";
		} else {
			Date start = null;
			try {
				start = Przelicznik.simpleDateFormat.parse(DayWork.czasRozpoczeciaS);
			} catch (ParseException e) {
				wyswietlKomunikat("Podaj czas rozpoczęcia w odpowiednim formacie!");
				ustalCzasRozpoczecia();
			}
		}

	}

	private static void ustalCzasZakonczenia() {
		Scanner scan = new Scanner(System.in);

		wyswietlKomunikat("Podaj czas zakończenia (jeśli to pominiesz, przyjmuję Twój default, czyli 17:30:00)");
		DayWork.czasZakonczeniaS = scan.nextLine();
		if (DayWork.czasZakonczeniaS.equalsIgnoreCase("")) {
			DayWork.czasZakonczeniaS = "17:30:00";
		} else {
			Date end = null;
			try {
				end = Przelicznik.simpleDateFormat.parse(DayWork.czasZakonczeniaS);
			} catch (ParseException e) {
				wyswietlKomunikat("Podaj czas zakończenia w odpowiednim formacie!");
				ustalCzasZakonczenia();
			}
		}
	}

	public static long wyliczCzasOdDo(String czas1, String czas2) {
		Date start = null;
		Date end = null;
		try {
			start = Przelicznik.simpleDateFormat.parse(czas1);
			end = Przelicznik.simpleDateFormat.parse(czas2);
			DayWork.czasOdDo = (end.getTime() - start.getTime());
			wyswietlKomunikat("Dzięki! Generalnie praca w godz. " + DayWork.czasRozpoczeciaS + "-"
					+ DayWork.czasZakonczeniaS + ", czyli " + Przelicznik.formatZSekundamiStatic(DayWork.czasOdDo));
		} catch (ParseException e) {
			wyswietlKomunikat("Podaj czasy w odpowiednim formacie");
			ustalCzasRozpoczecia();
		}
		return DayWork.czasOdDo;
	}

	private static void ustalWystepowaniePrzerw() {
		wyswietlKomunikat("Czy były nieciągłości? np. prywatne wyjścia albo przemieszczanie? Podaj T lub N");
		Scanner scan = new Scanner(System.in);
		DayWork.czyPrzerwy = scan.nextLine();

		if (DayWork.czyPrzerwy.equalsIgnoreCase("T")) {
			DayWork.przerwy = true;
			ustalLacznyCzasPrzerw();
			wyswietlKomunikat("OK, łączny czas przerw to "
					+ Przelicznik.formatZSekundamiStatic(DayWork.czasLacznyPrzerw));
			wyliczDziennyCzasPracy(DayWork.czasOdDo, DayWork.czasLacznyPrzerw);
		} else if (DayWork.czyPrzerwy.equalsIgnoreCase("N")) {
			System.out.println("OK, nie było przerw - będzie prościej");
			DayWork.czasLacznyPrzerw = 0;
			wyliczDziennyCzasPracy(DayWork.czasOdDo, DayWork.czasLacznyPrzerw);
		} else {
			wyswietlKomunikat("Podano nierozpoznaną komendę!");
			ustalWystepowaniePrzerw();
		}
	}

	private static void ustalLacznyCzasPrzerw() {
		wyswietlKomunikat("Podaj łączny czas przerw");
		Scanner scan2 = new Scanner(System.in);
		DayWork.czasLacznyPrzerwS = scan2.nextLine();

		try {
			DayWork.czasLacznyPrzerw = Przelicznik.zamienStringNaLiczbeLong(DayWork.czasLacznyPrzerwS); // konwersja
		} catch (NumberFormatException e) {
			wyswietlKomunikat("Podaj łączny czas przerw w odpowiednim formacie!");
			ustalLacznyCzasPrzerw();
		}

	}

	private static void wyliczDziennyCzasPracy(long czasOD, long przerwy) {
		DayWork.czasFaktyczny = czasOD - przerwy;
		wyswietlKomunikat("Dzięki! czyli dzienny czas pracy to "
				+ Przelicznik.formatZSekundamiStatic(DayWork.czasFaktyczny));

	}

	private static void ustalWykonywaneZadania() {
		wyswietlKomunikat("Podaj wykonywane zadania jedno po drugim. Aby zakończyć wprowadzanie zadań, wpisz E (jak End)");
		dodajZadanie();
	}

	public static void dodajZadanie() {
		wyswietlKomunikat("Podaj zadanie:");
		Scanner scan = new Scanner(System.in);
		String podano = scan.nextLine();

		if (podano.equalsIgnoreCase("E")) {
			wyswietlKomunikat("OK, dodano już wszystkie wykonywane dziś zadania ");
		}

		else {
			Zadanko ostatnieZadanko = new Zadanko(podano);
			dodajZadanie();
		}
	}

	private static void ustalCzasDlaPoszczegolnychZadan() {
		Scanner scan = new Scanner(System.in);
		for (Zadanko z : Zadanko.zadaniaDnia) {
			wyswietlKomunikat(z.nazwa + " - podaj czas:");
			z.czas = scan.nextLine();
		}
		wyswietlKomunikat("Dzięki! Podano czasy");
		for (Zadanko z : Zadanko.zadaniaDnia) {
			wyswietlKomunikat(z.nazwa + " - " + z.czas);
		}
	}

	private static void wyswietlWstepnaRozpiske() {
		long suma = obliczSumeCzasuZadan();
		long reszta = DayWork.czasFaktyczny - suma;

		String podsumowanie = "Łączny czas zadań: " + Przelicznik.formatZSekundamiStatic(suma) + "\n"
				+ "Faktyczny dzienny czas pracy: " + Przelicznik.formatZSekundamiStatic(DayWork.czasFaktyczny) + "\n";

		if (reszta == 0) {
			wyswietlKomunikat(podsumowanie + "Jest ok. Możesz wpisać do Redmine:");
			wyswietlRozpiskeDoWpisaniaDoRedmine();

		} else if (reszta > 0) {
			wyswietlKomunikat(podsumowanie + "Nie zgadza się - zostało " + Przelicznik.formatZSekundamiStatic(reszta)
					+ " do zagospodarowania. Wpisz czasy jeszcze raz");
			ustalCzasDlaPoszczegolnychZadan();
			wyswietlWstepnaRozpiske();
		}

		else if (reszta < 0) {
			wyswietlKomunikat(podsumowanie + "Nie zgadza się - wpisano za dużo o "
					+ Przelicznik.formatZSekundamiStatic(reszta * -1) + ". Trzeba je odjąć. Wpisz czasy jeszcze raz");
			ustalCzasDlaPoszczegolnychZadan();
			wyswietlWstepnaRozpiske();
		}
	}

	private static long obliczSumeCzasuZadan() {
		long sumaZadan = 0;
		for (Zadanko z : Zadanko.zadaniaDnia) {
			sumaZadan += Przelicznik.zamienStringNaLiczbeLong(z.czas);
		}
		return sumaZadan;
	}

	private static void wyswietlRozpiskeDoWpisaniaDoRedmine() {
		String info = "\n" + "-----------------" + "\n" + "GOTOWIEC DO REDMINE" + "\n";
		for (Zadanko z : Zadanko.zadaniaDnia) {
			info += z.nazwa
					+ " - "
					+ Przelicznik.skonwertujDoubleToString(Przelicznik
							.zamienCzasWMilisekundachNaDziesietnyDouble(Przelicznik.zamienStringNaLiczbeLong(z.czas)))
					+ "\n";
		}
		info += "Total dzienny: "
				+ Przelicznik.skonwertujDoubleToString(Przelicznik
						.zamienCzasWMilisekundachNaDziesietnyDouble(DayWork.czasFaktyczny)) + "\n";
		info += "--------------------" + "\n";
		wyswietlKomunikat(info);
	}

}
